{% extends "base.html" %} {% block title %}AI Handler Β· {{ app_name }}{% endblock %} {% block body %}

πŸ€– Your AI Handler βš™ a model on your own computer, under the grants you tick πŸ“–

{% if hosted %}

Not on a hosted instance β€” the AI Handler talks to a model on the pup's own network, and a hosted box's network is not yours.

{% elif mode == 'inert' %}

This box's Pup ID is a Handler's: a person handles here, so there is no AI Handler on it.

{% elif mode == 'kennel' %}

This box's Pup ID is an AI's: it is a kennel, and its model is the Handler of the packs it hosts. It speaks to their collared members, never to you. For each one it reads only what the kennel view shows β€” the card their box signed for their Handler, their signed grants, how their box answered its last commands β€” and queues at most three commands and a line, clamped to what they granted. Their box decides. πŸ“–

{% if set_up %}

🌐 This module says it reaches the network. {{ egress }}

{% if enabled and url %}on{% else %}off{% endif %} {{ model or 'no model named' }} {{ persona }} Β· {% if cycle_minutes %}thinks every {{ cycle_minutes }} min{% else %}thinks only when you ask{% endif %}

last thought
{{ last_cycle_at|rel(now) if last_cycle_at else 'never' }}
calls today
{{ calls_today }} of {{ max_calls }} one per member per thought

Its members

What it did

{% for r in log %} {% else %}{% endfor %}
whenmemberwhatsaidqueuedshown
{{ r.ts|rel(now) }} {% if r.fp %}{{ r.fp }}{% else %}β€”{% endif %} {% if r.kind == 'guard' %}refused Β· {{ r.error }}{% elif not r.ok %}no answer Β· {{ r.error }}{% else %}thought{% if r.error %} Β· {{ r.error }}{% endif %}{% endif %} {{ r.body or 'β€”' }} {% for a in r.actions %}{{ a.type }} Β· {{ kennel_codes.get(a.code, a.code) }} {% else %}β€”{% endfor %} {% for g in r.context %}{{ g }} {% endfor %}
Nothing yet.
{% endif %} {% elif not set_up %}

Not set up

Your AI Handler is a language model on your own Ollama β€” on this machine or your own network. Give it the address and the model in Settings β†’ AI Handler, switch it on, and tick what it may see and do on Consent. Until then it makes no call to anything. πŸ“–

{% else %}

🌐 This module says it reaches the network. {{ egress }}

{% if live %}on{% else %}off{% endif %} {{ model or 'no model named' }} {{ persona }} Β· {% if cycle_minutes %}thinks every {{ cycle_minutes }} min{% else %}thinks only when you ask{% endif %}

last thought
{{ last_cycle_at|rel(now) if last_cycle_at else 'never' }}
calls today
{{ calls_today }} of {{ max_calls }} cycles and chat together
lines today
{{ lines_today }} of {{ lines_per_day }}
{% if paused %}

πŸ›‘ Everything is paused: your AI Handler does nothing, sees nothing it was granted, and gets none of your reflections until you resume.

{% endif %}

Today its latest line β€” the rules line on your Handler page always stands

{#- the Handler page's own reader: gone once it is switched off, its line revoked or you paused; masked while your lock is hidden (the words are yours to reveal THERE only) -#} {% if line and line.masked %}

{{ line.text }} tap to reveal

{{ line.ts|rel(now) }} Β· never relayed

{% elif line %}

β€œ{{ line.text }}”

{{ line.ts|rel(now) }}{% if line.relay %} Β· safe to relay{% else %} Β· never relayed{% endif %}

{% else %}

Nothing said today.

{% endif %}

Talk to it talk only β€” nothing here changes the game

Your reflections reach it only here, only if you granted β€œ{{ labels['read.reflections'][0] }}”, and never while paused. πŸ“–

What it sees granted on Consent

{% if caps %} {% else %}

Nothing granted{% if paused %} that it can use while paused{% endif %} β€” it sees today's duties, your streak, your own training and the app's own observations, and can do nothing.

{% endif %} {% if preview %}
This is exactly what the next thought will send
{{ preview }}
{% endif %}

Never your reflections (chat only), never anybody else's words, nothing about your health but β€œgo gently”. πŸ“–

What it did

{% for r in log %} {% else %}{% endfor %}
whenwhatsaidasked forshown
{{ r.ts|rel(now) }} {% if r.kind == 'guard' %}refused Β· {{ error_says(r.error) }}{% elif not r.ok %}no answer Β· {{ error_says(r.error) }}{% else %}thought{% if r.error %} Β· {{ error_says(r.error) }}{% endif %}{% endif %} {{ r.shown or 'β€”' }}{% if r.relay %} relay-safe{% endif %} {% for a in r.actions %}{{ a.type }} Β· {{ action_says.get(a.code, a.code) }} {% else %}β€”{% endfor %} {% for g in r.context %}{{ g }} {% endfor %}
Nothing yet.
{% endif %} {% endblock %}